
export default {
  props:{
    column:{
      type: [Array,Object],
      default: []
    },
    data:{
      type: [Object],
      default: {}
    },
    rules:{
      type: [Object],
      default: {}
    }
  },
  created(){
    _.assign(this.opt,this.column,{options:this.opt?.options});
    this.column.$this = this; // 特殊处理时方便调用内部方法
  },
  methods:{
    getClz(arr = []){
      arr.push(this.column.className||'');
      return arr.join(' ')
    },
    initData(){
      init_data(this);
    },
    initOptions(){
      init_options(this);
      init_onOptions(this);
    },
    setOpt(conf){
      if(this.setValue){
        Object.assign(this.opt,conf);
        init_data(this);
        conf.value !== void 0 && (this.setValue(conf.value));
      }
    },
    triggerClick(name){
      let fun = this.column[name];
      fun && fun(this.data);
    }
  }
}

// 初始化配置
function init_data(sc){
  if(sc.classNames?.length){
    _.pull(sc.classNames,"is-disabled");
    //
    let cls = sc.opt.props.disabled ? "is-disabled" : '';
    cls && sc.classNames.push(cls);
  }
}

// 初始化options
function init_options(sc){
  let column = sc.column;
  let n = column.name, data = sc.data, options = column.options;
  let value = data[n];
  let setFirstValue = (list = [])=>{
    sc.setOpt({options:list})
    // 默认触发setValueMap
    if(value != data[n]){
      sc.setValue(data[n]);
    }
  }
  //
  _.extend(sc.opt,column,{options:[]});
  if(typeof options === 'string' && options){// 自加载
    sc.dict.init([options]).then(()=>{
      setFirstValue(sc.dict.type[options])
    })
  }else if(typeof options === 'function'){
    options().then((data)=>{
      setFirstValue(data);
    })
  }else{
    setFirstValue(options);
  }
}

// 初始化onOptions
function init_onOptions(sc){
  let onOptions = sc.opt.onOptions;
  if(!onOptions || _.isFunction(onOptions)){
    return;
  }
  // map {xxx:v}
  let map = onOptions, arr = Object.keys(map);
  sc.opt.onOptions = function(data,column,rows){
    let row = rows[0]?.raw || rows[0];
    if(row){
      arr.forEach((key)=>{
        data[key] = row[map[key]];
      })
    }else{
      arr.forEach((key)=>{
        data[key] = void 0;
      })
    }
  }
}
